﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AudiPyme.DAL;

namespace AudiPyme.BLL
{
    //Clase que sirve para formatear las relaciones Tipo Activo - Amenaza - Criterio de Riesgo que tiene una empresa
    public class InstanciaTipActAmenCritTabla
    {
        int idTipoActivo;
        int idAmenaza;
        int idCriterioRiesgo;
        String tipoActivo;
        String amenaza;
        String criterioRiesgo;

        public int IdTipoActivo
        {
            get { return idTipoActivo; }
            set { idTipoActivo = value; }
        }

        public int IdAmenaza
        {
            get { return idAmenaza; }
            set { idAmenaza = value; }
        }

        public int IdCriterioRiesgo
        {
            get { return idCriterioRiesgo; }
            set { idCriterioRiesgo = value; }
        }

        public String TipoActivo
        {
            get { return tipoActivo; }
            set { tipoActivo = value; }
        }

        public String Amenaza
        {
            get { return amenaza; }
            set { amenaza = value; }
        }

        public String CriterioRiesgo
        {
            get { return criterioRiesgo; }
            set { criterioRiesgo = value; }
        }

        public InstanciaTipActAmenCritTabla(int IdTipoActivo, int IdAmenaza, int IdCriterio, String TipoActivo, String Amenaza, String Criterio)
        {
            idTipoActivo = IdTipoActivo;
            idAmenaza = IdAmenaza;
            idCriterioRiesgo = IdCriterio;
            tipoActivo = TipoActivo;
            amenaza = Amenaza;
            criterioRiesgo = Criterio;
        }

        public InstanciaTipActAmenCritTabla()
        {
            idTipoActivo = 0;
            idAmenaza = 0;
            idCriterioRiesgo = 0;
            tipoActivo = "";
            amenaza = "";
            criterioRiesgo = "";
        }

        //Recoge las instancias que tiene actualmente seleccionadas la empresa
        public static List<InstanciaTipActAmenCritTabla> RecogeInstanciasEmpresa(int EmpresaUsuario)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<InstanciaTipActAmenCritTabla> LRelaciones = new List<InstanciaTipActAmenCritTabla>();
            //Recogemos las Relaciones Tipo Activo - Amenaza - Criterio de Riesgo actuales de la Empresa
            IQueryable<InstanciaTipActAmenCritTabla> relTipActAmenCritQuery = (from m in agenteBD.InstanciaTiposActivosAmenazasCriteriosRiesgoEstablecer
                                                                               join t in agenteBD.TiposActivosEstablecer on m.IdTipoActivo equals t.IdTipoActivo
                                                                               join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                                               join c in agenteBD.CriteriosRiesgoEstablecer on m.IdCriterioRiesgo equals c.IdCriterioRiesgo
                                                                               where m.IdEmpresa == EmpresaUsuario && m.Actual == true
                                                                               select new InstanciaTipActAmenCritTabla { IdTipoActivo = m.IdTipoActivo, TipoActivo = t.TipoActivo, IdAmenaza = m.IdAmenaza, Amenaza = a.Amenaza, IdCriterioRiesgo = m.IdCriterioRiesgo, CriterioRiesgo = c.CriterioRiesgo }).Distinct().OrderBy(t => t.IdTipoActivo).ThenBy(a => a.IdAmenaza).ThenBy(c => c.IdCriterioRiesgo);
            if (relTipActAmenCritQuery.Count() != 0)
            {
                LRelaciones = relTipActAmenCritQuery.ToList();
            }
            return LRelaciones;
        }

        //Recoge las instancias que tiene actualmente seleccionadas la empresa con el nombre de Tipo de Activo que coincida con el patrón de búsqueda TextoBuscar
        public static List<InstanciaTipActAmenCritTabla> RecogeInstanciasEmpresaPorTipoActivo(int IdEmpresa, String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<InstanciaTipActAmenCritTabla> LRelaciones = new List<InstanciaTipActAmenCritTabla>();
            //Recogemos las Relaciones Tipo Activo - Amenaza - Criterio de Riesgo actuales de la Empresa
            IQueryable<InstanciaTipActAmenCritTabla> relTipActAmenCritQuery = (from m in agenteBD.InstanciaTiposActivosAmenazasCriteriosRiesgoEstablecer
                                                                               join t in agenteBD.TiposActivosEstablecer on m.IdTipoActivo equals t.IdTipoActivo
                                                                               join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                                               join c in agenteBD.CriteriosRiesgoEstablecer on m.IdCriterioRiesgo equals c.IdCriterioRiesgo
                                                                               where m.IdEmpresa == IdEmpresa && m.Actual == true && t.TipoActivo.Contains(TextoBuscar)
                                                                               select new InstanciaTipActAmenCritTabla { IdTipoActivo = m.IdTipoActivo, TipoActivo = t.TipoActivo, IdAmenaza = m.IdAmenaza, Amenaza = a.Amenaza, IdCriterioRiesgo = m.IdCriterioRiesgo, CriterioRiesgo = c.CriterioRiesgo }).Distinct().OrderBy(t => t.IdTipoActivo).ThenBy(a => a.IdAmenaza).ThenBy(c => c.IdCriterioRiesgo);
            if (relTipActAmenCritQuery.Count() != 0)
            {
                LRelaciones = relTipActAmenCritQuery.ToList();
            }
            return LRelaciones;
        }

        //Recoge las instancias que tiene actualmente seleccionadas la empresa con el nombre de la Amenaza que coincida con el patrón de búsqueda TextoBuscar
        public static List<InstanciaTipActAmenCritTabla> RecogeInstanciasEmpresaPorAmenaza(int IdEmpresa, String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<InstanciaTipActAmenCritTabla> LRelaciones = new List<InstanciaTipActAmenCritTabla>();
            //Recogemos las Relaciones Tipo Activo - Amenaza - Criterio de Riesgo actuales de la Empresa
            IQueryable<InstanciaTipActAmenCritTabla> relTipActAmenCritQuery = (from m in agenteBD.InstanciaTiposActivosAmenazasCriteriosRiesgoEstablecer
                                                                               join t in agenteBD.TiposActivosEstablecer on m.IdTipoActivo equals t.IdTipoActivo
                                                                               join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                                               join c in agenteBD.CriteriosRiesgoEstablecer on m.IdCriterioRiesgo equals c.IdCriterioRiesgo
                                                                               where m.IdEmpresa == IdEmpresa && m.Actual == true && a.Amenaza.Contains(TextoBuscar)
                                                                               select new InstanciaTipActAmenCritTabla { IdTipoActivo = m.IdTipoActivo, TipoActivo = t.TipoActivo, IdAmenaza = m.IdAmenaza, Amenaza = a.Amenaza, IdCriterioRiesgo = m.IdCriterioRiesgo, CriterioRiesgo = c.CriterioRiesgo }).Distinct().OrderBy(t => t.IdTipoActivo).ThenBy(a => a.IdAmenaza).ThenBy(c => c.IdCriterioRiesgo);
            if (relTipActAmenCritQuery.Count() != 0)
            {
                LRelaciones = relTipActAmenCritQuery.ToList();
            }
            return LRelaciones;
        }

        //Recoge las instancias que tiene actualmente seleccionadas la empresa con el nombre de criterio de riesgo que coincida con el patrón de búsqueda TextoBuscar
        public static List<InstanciaTipActAmenCritTabla> RecogeInstanciasEmpresaPorCriterioRiesgo(int IdEmpresa, String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<InstanciaTipActAmenCritTabla> LRelaciones = new List<InstanciaTipActAmenCritTabla>();
            //Recogemos las Relaciones Tipo Activo - Amenaza - Criterio de Riesgo actuales de la Empresa
            IQueryable<InstanciaTipActAmenCritTabla> relTipActAmenCritQuery = (from m in agenteBD.InstanciaTiposActivosAmenazasCriteriosRiesgoEstablecer
                                                                               join t in agenteBD.TiposActivosEstablecer on m.IdTipoActivo equals t.IdTipoActivo
                                                                               join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                                               join c in agenteBD.CriteriosRiesgoEstablecer on m.IdCriterioRiesgo equals c.IdCriterioRiesgo
                                                                               where m.IdEmpresa == IdEmpresa && m.Actual == true && c.CriterioRiesgo.Contains(TextoBuscar)
                                                                               select new InstanciaTipActAmenCritTabla { IdTipoActivo = m.IdTipoActivo, TipoActivo = t.TipoActivo, IdAmenaza = m.IdAmenaza, Amenaza = a.Amenaza, IdCriterioRiesgo = m.IdCriterioRiesgo, CriterioRiesgo = c.CriterioRiesgo }).Distinct().OrderBy(t => t.IdTipoActivo).ThenBy(a => a.IdAmenaza).ThenBy(c => c.IdCriterioRiesgo);
            if (relTipActAmenCritQuery.Count() != 0)
            {
                LRelaciones = relTipActAmenCritQuery.ToList();
            }
            return LRelaciones;
        }



        //Recoge las relaciones tipo activo - amenaza - criterio de riesgo que no están actualmente seleccionadas
        //por la empresa
        public static List<InstanciaTipActAmenCritTabla> RecogePosiblesInstanciasIncluir(int IdEmpresa)
        {
            List<InstanciaTipActAmenCritTabla> LRelaciones = new List<InstanciaTipActAmenCritTabla>();
            //Lista de Tipos de Activos que hay actualmente en la Empresa. Sirve para que no salgan relaciones
            //cuyos tipos de activo no estén presentes en los activos elegidos por una empresa. De esta forma
            //se filtran relaciones que en la situación actual de la empresa no son necesarias mostar y por tanto,
            //no tendrían importancia en el Análisis de Riesgo al no existir activos de la empresa que afecten
            List<int> LTiposActivosEnEmpresa = ActivosEmpresaFactory.ActivosEmpresaTipoActivo(IdEmpresa);
            ModeloContainer agenteBD = new ModeloContainer();
            //Relaciones Tipo Activo-Amenaza-Criterio de Riesgo actuales de la empresa
            var relacionesEmp = from i in agenteBD.InstanciaTiposActivosAmenazasCriteriosRiesgoEstablecer
                                where i.IdEmpresa == IdEmpresa && i.Actual == true
                                select new { i.IdTipoActivo, i.IdAmenaza, i.IdCriterioRiesgo };
            //Relaciones Tipo Activo-Amenaza-Criterio de Riesgo de la Base de Conocimiento (Matriz)
            var relacionesTotal = from m in agenteBD.Matriz_TipoActivosAmenazasCriteriosRiesgoEstablecer
                                  select new { m.IdTipoActivo, m.IdAmenaza, m.IdCriterioRiesgo };
            //Conjunto disjunto de las anteriores relaciones
            var relacionesExc = relacionesTotal.Except(relacionesEmp);
            //Formateamos para Bindear al GridView las relaciones actuales
            IQueryable<InstanciaTipActAmenCritTabla> relacionesQuery = (from i in relacionesExc
                                                                        join m in agenteBD.Matriz_TipoActivosAmenazasCriteriosRiesgoEstablecer on
                                                                              new { i.IdTipoActivo, i.IdAmenaza, i.IdCriterioRiesgo } equals
                                                                              new { m.IdTipoActivo, m.IdAmenaza, m.IdCriterioRiesgo }
                                                                        join t in agenteBD.TiposActivosEstablecer on m.IdTipoActivo equals t.IdTipoActivo
                                                                        join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                                        join c in agenteBD.CriteriosRiesgoEstablecer on m.IdCriterioRiesgo equals c.IdCriterioRiesgo
                                                                        where (from ac in agenteBD.ActivosEmpresaEstablecer
                                                                               select ac.IdTipoActivo).Contains(t.IdTipoActivo) && m.Actual == true && LTiposActivosEnEmpresa.Contains(m.IdTipoActivo)
                                                                        select new InstanciaTipActAmenCritTabla { IdTipoActivo = t.IdTipoActivo, TipoActivo = t.TipoActivo, IdAmenaza = a.IdAmenaza, Amenaza = a.Amenaza, IdCriterioRiesgo = c.IdCriterioRiesgo, CriterioRiesgo = c.CriterioRiesgo }).Distinct().OrderBy(t=>t.IdTipoActivo).ThenBy(a=>a.IdAmenaza).ThenBy(c=>c.IdCriterioRiesgo);
            if (relacionesQuery.Count() != 0)
            {
                LRelaciones = relacionesQuery.ToList();
            }

            return LRelaciones;
        }

        //Recoge las relaciones tipo activo - amenaza - criterio de riesgo que no están actualmente seleccionadas
        //por la empresa según los Tipo de Activos que coincidan con el patrón de búsqueda de TextoBuscar
        public static List<InstanciaTipActAmenCritTabla> RelacionesPorTipoActivo(int IdEmpresa, String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<InstanciaTipActAmenCritTabla> LRelacionesTabla = new List<InstanciaTipActAmenCritTabla>();
            //Lista de Tipos de Activos que hay actualmente en la Empresa. Sirve para que no salgan relaciones
            //cuyos tipos de activo no estén presentes en los activos elegidos por una empresa. De esta forma
            //se filtran relaciones que en la situación actual de la empresa no son necesarias mostar y por tanto,
            //no tendrían importancia en el Análisis de Riesgo al no existir activos de la empresa que afecten
            List<int> LTiposActivosEnEmpresa = ActivosEmpresaFactory.ActivosEmpresaTipoActivo(IdEmpresa);
            //Relaciones Tipo Activo-Amenaza-Criterio de Riesgo actuales de la empresa
            var relacionesEmp = from i in agenteBD.InstanciaTiposActivosAmenazasCriteriosRiesgoEstablecer
                                where i.IdEmpresa == IdEmpresa && i.Actual == true
                                select new { i.IdTipoActivo, i.IdAmenaza, i.IdCriterioRiesgo };
            //Relaciones Tipo Activo-Amenaza-Criterio de Riesgo actuales de la Base de Conocimiento (Matriz) con el Filtro de Tipo de Activo
            IQueryable<Matriz_TipoActivosAmenazasCriteriosRiesgo> LRelaciones = from m in agenteBD.Matriz_TipoActivosAmenazasCriteriosRiesgoEstablecer
                                                                                join t in agenteBD.TiposActivosEstablecer on m.IdTipoActivo equals t.IdTipoActivo
                                                                                where t.TipoActivo.Contains(TextoBuscar) && m.Actual == true
                                                                                select m;
            var relacionesTotal = from LR in LRelaciones
                                  select new { LR.IdTipoActivo, LR.IdAmenaza, LR.IdCriterioRiesgo };
            var relacionesExc = relacionesTotal.Except(relacionesEmp);
            //Formateamos para Bindear al GridView con las relaciones actuales obtenidas
            IQueryable<InstanciaTipActAmenCritTabla> relacionesQuery = (from i in relacionesExc
                                                                        join m in agenteBD.Matriz_TipoActivosAmenazasCriteriosRiesgoEstablecer on
                                                                              new { i.IdTipoActivo, i.IdAmenaza, i.IdCriterioRiesgo } equals
                                                                              new { m.IdTipoActivo, m.IdAmenaza, m.IdCriterioRiesgo }
                                                                        join t in agenteBD.TiposActivosEstablecer on m.IdTipoActivo equals t.IdTipoActivo
                                                                        join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                                        join c in agenteBD.CriteriosRiesgoEstablecer on m.IdCriterioRiesgo equals c.IdCriterioRiesgo
                                                                        where (from ac in agenteBD.ActivosEmpresaEstablecer
                                                                               select ac.IdTipoActivo).Contains(t.IdTipoActivo) && m.Actual == true && LTiposActivosEnEmpresa.Contains(m.IdTipoActivo)
                                                                        select new InstanciaTipActAmenCritTabla { IdTipoActivo = t.IdTipoActivo, TipoActivo = t.TipoActivo, IdAmenaza = a.IdAmenaza, Amenaza = a.Amenaza, IdCriterioRiesgo = c.IdCriterioRiesgo, CriterioRiesgo = c.CriterioRiesgo }).Distinct().OrderBy(t => t.IdTipoActivo).ThenBy(a => a.IdAmenaza).ThenBy(c => c.IdCriterioRiesgo);

            if (relacionesQuery.Count() != 0)
            {
                LRelacionesTabla = relacionesQuery.ToList();
            }

            return LRelacionesTabla;

        }

        //Recoge las relaciones tipo activo - amenaza - criterio de riesgo que no están actualmente seleccionadas
        //por la empresa según las Amenazas que coincidan con el patrón de búsqueda de TextoBuscar
        public static List<InstanciaTipActAmenCritTabla> RelacionesPorAmenaza(int IdEmpresa, String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<InstanciaTipActAmenCritTabla> LRelacionesTabla = new List<InstanciaTipActAmenCritTabla>();
            //Lista de Tipos de Activos que hay actualmente en la Empresa. Sirve para que no salgan relaciones
            //cuyos tipos de activo no estén presentes en los activos elegidos por una empresa. De esta forma
            //se filtran relaciones que en la situación actual de la empresa no son necesarias mostar y por tanto,
            //no tendrían importancia en el Análisis de Riesgo al no existir activos de la empresa que afecten
            List<int> LTiposActivosEnEmpresa = ActivosEmpresaFactory.ActivosEmpresaTipoActivo(IdEmpresa);
            //Relaciones Tipo Activo-Amenaza-Criterio de Riesgo actuales de la empresa
            var relacionesEmp = from i in agenteBD.InstanciaTiposActivosAmenazasCriteriosRiesgoEstablecer
                                where i.IdEmpresa == IdEmpresa && i.Actual == true
                                select new { i.IdTipoActivo, i.IdAmenaza, i.IdCriterioRiesgo };
            //Relaciones Tipo Activo-Amenaza-Criterio de Riesgo actuales de la Base de Conocimiento (Matriz) con el Filtro de Amenaza
            IQueryable<Matriz_TipoActivosAmenazasCriteriosRiesgo> LRelaciones = from m in agenteBD.Matriz_TipoActivosAmenazasCriteriosRiesgoEstablecer
                                                                                join t in agenteBD.AmenazasEstablecer on m.IdAmenaza equals t.IdAmenaza
                                                                                where t.Amenaza.Contains(TextoBuscar) && m.Actual == true
                                                                                select m;
            var relacionesTotal = from LR in LRelaciones
                                  select new { LR.IdTipoActivo, LR.IdAmenaza, LR.IdCriterioRiesgo };
            var relacionesExc = relacionesTotal.Except(relacionesEmp);
            //Formateamos para Bindear al GridView con las relaciones actuales obtenidas
            IQueryable<InstanciaTipActAmenCritTabla> relacionesQuery = (from i in relacionesExc
                                                                        join m in agenteBD.Matriz_TipoActivosAmenazasCriteriosRiesgoEstablecer on
                                                                              new { i.IdTipoActivo, i.IdAmenaza, i.IdCriterioRiesgo } equals
                                                                              new { m.IdTipoActivo, m.IdAmenaza, m.IdCriterioRiesgo }
                                                                        join t in agenteBD.TiposActivosEstablecer on m.IdTipoActivo equals t.IdTipoActivo
                                                                        join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                                        join c in agenteBD.CriteriosRiesgoEstablecer on m.IdCriterioRiesgo equals c.IdCriterioRiesgo
                                                                        where (from ac in agenteBD.ActivosEmpresaEstablecer
                                                                               select ac.IdTipoActivo).Contains(t.IdTipoActivo) && m.Actual == true && LTiposActivosEnEmpresa.Contains(m.IdTipoActivo)
                                                                        select new InstanciaTipActAmenCritTabla { IdTipoActivo = t.IdTipoActivo, TipoActivo = t.TipoActivo, IdAmenaza = a.IdAmenaza, Amenaza = a.Amenaza, IdCriterioRiesgo = c.IdCriterioRiesgo, CriterioRiesgo = c.CriterioRiesgo }).Distinct().OrderBy(t => t.IdTipoActivo).ThenBy(a => a.IdAmenaza).ThenBy(c => c.IdCriterioRiesgo);

            if (relacionesQuery.Count() != 0)
            {
                LRelacionesTabla = relacionesQuery.ToList();
            }

            return LRelacionesTabla;

        }

        //Recoge las relaciones tipo activo - amenaza - criterio de riesgo que no están actualmente seleccionadas
        //por la empresa según los Criterios de Riesgo que coincidan con el patrón de búsqueda de TextoBuscar
        public static List<InstanciaTipActAmenCritTabla> RelacionesPorCriterio(int IdEmpresa, String TextoBuscar)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<InstanciaTipActAmenCritTabla> LRelacionesTabla = new List<InstanciaTipActAmenCritTabla>();
            //Lista de Tipos de Activos que hay actualmente en la Empresa. Sirve para que no salgan relaciones
            //cuyos tipos de activo no estén presentes en los activos elegidos por una empresa. De esta forma
            //se filtran relaciones que en la situación actual de la empresa no son necesarias mostar y por tanto,
            //no tendrían importancia en el Análisis de Riesgo al no existir activos de la empresa que afecten
            List<int> LTiposActivosEnEmpresa = ActivosEmpresaFactory.ActivosEmpresaTipoActivo(IdEmpresa);
            //Relaciones Tipo Activo-Amenaza actuales de la empresa
            var relacionesEmp = from i in agenteBD.InstanciaTiposActivosAmenazasCriteriosRiesgoEstablecer
                                where i.IdEmpresa == IdEmpresa && i.Actual == true
                                select new { i.IdTipoActivo, i.IdAmenaza, i.IdCriterioRiesgo };
            //Relaciones Tipo Activo-Amenaza-Criterio de Riesgo actuales de la Base de Conocimiento (Matriz) con el Filtro de Criterio de Riesgo
            IQueryable<Matriz_TipoActivosAmenazasCriteriosRiesgo> LRelaciones = from m in agenteBD.Matriz_TipoActivosAmenazasCriteriosRiesgoEstablecer
                                                                                join t in agenteBD.CriteriosRiesgoEstablecer on m.IdCriterioRiesgo equals t.IdCriterioRiesgo
                                                                                where t.CriterioRiesgo.Contains(TextoBuscar) && m.Actual == true
                                                                                select m;
            var relacionesTotal = from LR in LRelaciones
                                  select new { LR.IdTipoActivo, LR.IdAmenaza, LR.IdCriterioRiesgo };
            var relacionesExc = relacionesTotal.Except(relacionesEmp);
            //Formateamos para Bindear al GridView con las relaciones actuales obtenidas
            IQueryable<InstanciaTipActAmenCritTabla> relacionesQuery = (from i in relacionesExc
                                                                        join m in agenteBD.Matriz_TipoActivosAmenazasCriteriosRiesgoEstablecer on
                                                                              new { i.IdTipoActivo, i.IdAmenaza, i.IdCriterioRiesgo } equals
                                                                              new { m.IdTipoActivo, m.IdAmenaza, m.IdCriterioRiesgo }
                                                                        join t in agenteBD.TiposActivosEstablecer on m.IdTipoActivo equals t.IdTipoActivo
                                                                        join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                                                                        join c in agenteBD.CriteriosRiesgoEstablecer on m.IdCriterioRiesgo equals c.IdCriterioRiesgo
                                                                        where (from ac in agenteBD.ActivosEmpresaEstablecer
                                                                               select ac.IdTipoActivo).Contains(t.IdTipoActivo) && m.Actual == true && LTiposActivosEnEmpresa.Contains(m.IdTipoActivo)
                                                                        select new InstanciaTipActAmenCritTabla { IdTipoActivo = t.IdTipoActivo, TipoActivo = t.TipoActivo, IdAmenaza = a.IdAmenaza, Amenaza = a.Amenaza, IdCriterioRiesgo = c.IdCriterioRiesgo, CriterioRiesgo = c.CriterioRiesgo }).Distinct().OrderBy(t => t.IdTipoActivo).ThenBy(a => a.IdAmenaza).ThenBy(c => c.IdCriterioRiesgo);

            if (relacionesQuery.Count() != 0)
            {
                LRelacionesTabla = relacionesQuery.ToList();
            }

            return LRelacionesTabla;

        }

    }
}
